package com.stt.videoprocess.design.model;

import com.stt.videoprocess.design.state.VideoProcessingState;
import com.stt.videoprocess.design.state.impl.InitState;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * 视频处理任务实体
 * 存储任务元数据及处理状态
 */
@Data
public class VideoTask {
    /**
     * 任务唯一标识符（UUID格式）
     * 由系统自动生成，用于任务追踪和状态查询
     */
    private String taskId;

    /**
     * 原始视频文件名（包含扩展名）
     * 保存用户上传时的原始文件名
     */
    private String originalFile;

    /**
     * 任务处理状态枚举值
     * 包含：INIT（初始化）, PROCESSING（处理中）, COMPLETED（完成）, FAILED（失败）
     */
    private ProcessingStatus status;

    /**
     * 任务创建时间戳
     * 使用系统本地时间，格式：yyyy-MM-ddTHH:mm:ss
     */
    private LocalDateTime createTime;

    /**
     * 最后状态更新时间戳
     * 每次状态变更时自动更新
     */
    private LocalDateTime updateTime;

    /**
     * 已完成的处理步骤记录（JSON格式）
     * 按顺序记录成功执行的处理步骤及耗时
     */
    private String processingSteps;

    /**
     * 错误详细信息（可选）
     * 当状态为FAILED时存储异常堆栈信息
     */
    private String errorMessage;

    // 状态模式核心字段
    private VideoProcessingState state;

    /**
     * 构造函数，初始化任务状态为INIT
     */
    public VideoTask() {
        this.state = new InitState();
        this.status = ProcessingStatus.INIT;
        this.createTime = LocalDateTime.now();
        this.updateTime = LocalDateTime.now();
        this.state.handle(this);
    }

    /**
     * 改变任务状态
     */
    public void changeState(VideoProcessingState newState) {
        this.state = newState;
        this.state.handle(this);
    }

    /**
     * 获取当前状态
     */
    public VideoProcessingState getState() {
        return state;
    }
}
